package com.itheima.study.zk.crud;


import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;

import java.util.List;

/**
 * 对zookeeper节点增删改查的操作
 */
public class CRUDDemo {
    public static void main(String[] args) throws Exception {

        //超时重连策略，每隔1s重试一次，共重试10次
        RetryPolicy retryPolicy = new RetryNTimes(10,1000);
        //构造zk客户端
        CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",retryPolicy);
        //启动client
        client.start();

        /////////////////////////////////////查询子节点///////////////////////
        List<String> rootNodes = client.getChildren().forPath("/");
        System.out.println("[查询子节点]根节点："+rootNodes);
        /////////////////////////////////////创建/////////////////////////////
        //1-创建节点（父节点要先存在）
        client.create().forPath("/a");
        //2-创建节点且指定数据（父节点要先存在）
        client.create().forPath("/b","这是b节点的内容".getBytes());
        //3-循环创建，如果父节点不存在则自动创建
        client.create().creatingParentsIfNeeded().forPath("/c/d");
        //4-指定模式
        //CreateMode.PERSISTENT 永久节点(默认)
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/e");
        //CreateMode.PERSISTENT_SEQUENTIAL 永久有序节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/f");
        //CreateMode.EPHEMERAL  临时节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/g");
        //CreateMode.EPHEMERAL_SEQUENTIAL 临时有序节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/h");

        System.out.println("[创建]完成,根节点："+client.getChildren().forPath("/"));
        System.out.println("[创建]完成，输入任何字符继续……");
        System.in.read();

        /////////////////////////////////////查询//////////////////////////////
        byte[] values = client.getData().forPath("/b");
        System.out.println("[查询]path:/b,value:"+new String(values));

        ////////////////////////////////////修改////////////////////////////////
        client.setData().forPath("/b","这是修改后的b节点内容".getBytes());
        System.out.println("[修改]完成，path:/b,value:"+new String(client.getData().forPath("/b")));

        ///////////////////////////////////删除////////////////////////////////
        //deletingChildrenIfNeeded - 如果有未删除的子节点则先删除子节点
        client.delete().deletingChildrenIfNeeded().forPath("/a");
        client.delete().deletingChildrenIfNeeded().forPath("/b");
        client.delete().deletingChildrenIfNeeded().forPath("/c");
        client.delete().deletingChildrenIfNeeded().forPath("/e");
        System.out.println("[删除]完成,根节点："+client.getChildren().forPath("/"));

        //关闭客户端
        client.close();
    }

}
